/* 拓扑排序
* 1.做法:
    (1) 合并两个集合
    (2) 查询某个元素的祖宗节点
    (3) 记录方法:
        记录每个集合大小: 绑定到根节点上
        记录每个点到根节点的距离: 绑定到每个元素上

* 2.离散化:
    (1) 保留排序: 排序，判重，二分
    (2) 不保留排序: map, hash

* 3.扩展域:
    带扩展域并查集中每个并查集中存的都是条件
    集合中有一个条件成立, 则集合中所有条件均成立
    有多少种不同的条件，就将空间分成多少份，看成是不同的条件的集合
    当题目给定一个条件的时候，先判断当前并查集中的条件是否与给出的条件存在冲突，
    如果发生冲突，那么将所有可以满足这个条件的语句写到集合中，直到产生冲突或者一直没有冲突到结束为止。

* 本题: 扩展域
    本题一共只有只有两种不同的条件，所以将集合的空间分成两份
    每次将满足的条件加到集合中，直到出现不合法的条件为止
    [a,b]为偶数
    不合法的条件有：                    合法的条件是：
    1.s[a - 1]是奇数，而s[b]是偶数      1.s[a - 1] 和 s[b]都是偶数
    2.s[a - 1]是偶数，而s[b]是奇数      2.s[a - 1] 和 s[b]都是奇数

    [a,b]区间的值为奇数时，
    不合法的条件是：                    合法的条件是：
    1.s[a - 1]和s[b]都是偶数            1.s[a - 1]是奇数，s[b]为偶数
    2.s[a - 1]和s[b]都是奇数            2.s[a - 1]是偶数. s[b]为奇数
*/

#pragma GCC optimize("O1,O2,O3,Ofast")
#pragma GCC optimize("no-stack-protector,unroll-loops,fast-math,inline")
#pragma GCC target("avx,avx2,fma")
#pragma GCC target("sse,sse2,sse3,sse4,sse4.1,sse4.2,ssse3")

#include <iostream>
#include <cstring>
#include <algorithm> 
#include <vector>
#include <unordered_map>
// #define ONLINE_GUDGE
using namespace std;
const int N = 400010, base = N / 2;

int n, m, k;
int fa[N];
unordered_map<int, int> hsh;

inline int find(int x)
{
    if(fa[x] != x){
        int fx = find(fa[x]);
        fa[x] = fx;
    }
    return fa[x];
}

inline int map(int x) {
    if (hsh.count(x)) {
        return hsh[x];
    }
    return hsh[x] = ++k;
}

int main()
{

    #ifdef ONLINE_JUDGE
    ios::sync_with_stdio(false);   
	cin.tie(0);
    #else
    freopen("./in.txt","r",stdin);
    #endif
    cin >> n >> m; n = 0;
    for(int i = 0; i< N; i++) fa[i] = i;
    
    int res = m; //如果无矛盾, 输出问题数量, 初始的时候为m
    for (int i = 1; i <= m; i++) {
        int l, r; string op; cin >> l >> r >> op;
        l = map(l-1); r = map(r);

        if(op == "odd"){
            if(find(l + base) == find(r + base)){ // +base为偶数
                res = i-1; break;
            }
            fa[find(l)] = find(r + base);
            fa[find(l + base)] = find(r);
        }
        else{
            if(find(l + base) == find(r)){
                res = i-1; break;
            }
            fa[find(l)] = find(r);
            fa[find(l + base)] = find(r + base);
        }
    }
    cout << res << endl;
    return 0;
}
